
#include <stdio.h>

#include <assert.h>

#include <compl.h>


static inline USED void test_used(){

}

int tes_func(FUNC_ARGLIST(5)){
	// int a[] = {};
	// arg0 = 0;
	// PARAM_USED(arg0);
	// MAPS(PARAM_USED, arg0, arg1, arg2, arg3, arg4);
	PARAM_USED(arg0, arg1, arg2, arg3, arg4);
	// __FFSG(5);
	
	return 0;
}

void test_atomic(){
	word_t val = 0;
	word_t tmp = val;
	cmb();

	/* 这句断言不成立，因为cas可能会失败 */
	
	// assert(cas(&val, &tmp, -1) == TRUE);
	// cas(&val, &tmp, -1);
	if (cas(&val, &tmp, -1) == TRUE){
		assert(tmp == (word_t)0);
		assert(val == (word_t)-1);
	}
	val = (word_t)-1;
	wmb();
	assert(faa(&val, 5) == (word_t)-1);
	assert(val == 4);

	rmb();
	assert(fas(&val, 3) == (word_t)4);
	assert(val == 1);

	assert(swp(&val, 65535) == (word_t)1);
	assert(val == 65535);
	mp_wmb();
}

void test_bitops()
{

}

void test_cassert(){
	word_t tmp1 = 0 ;
	word_t tmp2 = 0;
	SASSERT(sizeof(tmp1) == sizeof(tmp2));
	int b = TIF_ELSE(sizeof(tmp1) == sizeof(tmp2), 0xBEEF, 0xDEAD);
	assert(b == 0xBEEF);
}



// __HANDLE_MEFF(print, printf)
// __DECL_MEFF(int, print, (const char *fmt, ...))

// SAI int add(int a, int b){
//	 printf("%d\n", a+b);
//	 return a+b;
// }

// __HANDLE_MEFF(myadd, add)
// __DECL_MEFF(int, myadd, (int a, int b))


// SAI int sub (int a, int b){
//	 printf("%d\n", a-b);
//	 return a-b;
// }



// DECL_MEFF(int, mysub, (int a, int b))			  
// HANDLE_MEFF(mysub, sub);			  



// void test_meff(){
//	 print("sdasd\n");
//	 int c = myadd(1, 2);
//	 assert(c == 3);
//	 int d = mysub(2, 1);
//	 assert(d == 1);
// }

int main(){
	test_atomic();
	test_bitops();



	test_cassert();

	// test_candy();
	// test_fastcont();
	// test_trycatch();
	// test_meff();

	// test_cont();
	// void *p = malloc(sizeof(word_t));
	// free(p);
	// free(p);
	// int a;
	// int b = a+1;
	// printf("%d\n",b);
	printf("all test passed\n");
	return 0;
}
